跳到主要内容

Julia 生成函数

阐述

在编译时能够用所有参数的类型信息进行计算进而生成特化代码的函数。这种函数的按类型派发机制可以比多重派发更自由。生成函数是用一个特殊的宏 @generated 定义的,在函数体内变量将用实参的类型来赋值,并且该函数返回实际生成的函数定义的表达式。生成函数具有以下特点:

  • 函数被生成几次属于实现细节,不能依赖于这个特点,所以生成函数不能有副作用
  • 在函数体内不能读取或更改非常量全局状态(如 IO、字典、hasmethod),也不能定义闭包和生成器
    • 因为函数和方法的定义也是一种全局状态,所以只能调用那些在生成函数定义前已经定义的函数和方法

实例

用生成函数进行编译器循环展开:

julia> @generated function sub2ind_gen(dims::NTuple{N}, I::Integer...) where N
ex = :(I[$N] - 1)
for i = (N - 1):-1:1
ex = :(I[$i] - 1 + dims[$i] * $ex)
end
return :($ex + 1)
end
sub2ind_gen (generic function with 1 method)

julia> sub2ind_gen((3, 5), 1, 2)
4

性质

相关内容

参考文献